package com.wysql.common.util;

import ch.obermuhlner.math.big.BigDecimalMath;
import lombok.Builder;
import lombok.Data;

import java.math.BigDecimal;
import java.math.MathContext;

/**
 * 趋势外推法实体类
 */

@Data
@Builder
public class Hgqx {
    private BigDecimal startYear;
    private BigDecimal year;
    private BigDecimal zs;
    private BigDecimal xx;
    private BigDecimal mhs;
    private BigDecimal dshs;
    private BigDecimal dxs;
    private BigDecimal pjz;
    // 加权2
    private BigDecimal j2;
    // 加权0.5
    private BigDecimal j5;

    // 输入指数
    private BigDecimal[] zsSr;
    // 输入线性函数
    private BigDecimal[] xxSr;
    // 输入幂函数
    private BigDecimal[] mhsSr;
    // 输入对数函数
    private BigDecimal[] dshsSr;
    // 输入多项式
    private BigDecimal[] dxsSr;

    public BigDecimal getZs() {
        return zsSr[0].multiply(BigDecimalMath.pow(BigDecimalMath.e(MathContext.DECIMAL64), zsSr[1].multiply(year.subtract(startYear).add(new BigDecimal("1"))), MathContext.DECIMAL64));
    }

    public BigDecimal getXx() {
        return xxSr[0].multiply(year.subtract(startYear).add(new BigDecimal("1"))).add(xxSr[1]);
    }

    public BigDecimal getMhs() {
        return mhsSr[0].multiply(BigDecimalMath.pow(year.subtract(startYear).add(new BigDecimal("1")), mhsSr[1], MathContext.DECIMAL64));
    }

    public BigDecimal getDshs() {
        return BigDecimalMath.log(year.subtract(startYear).add(new BigDecimal("1")), MathContext.DECIMAL64).multiply(dshsSr[0]).add(dshsSr[1]);
    }

    public BigDecimal getDxs() {
        BigDecimal yearJg = year.subtract(startYear).add(new BigDecimal("1"));
        return dxsSr[0].multiply(yearJg.pow(2)).add(
                dxsSr[1].multiply(yearJg)
        ).add(dxsSr[2]);
    }

    public BigDecimal getPjz() {
        return getZs().add(getXx()).add(getDxs()).add(getMhs()).add(getDshs()).divide(new BigDecimal(5), MathContext.DECIMAL64);
    }

    public BigDecimal getJ2() {
        return
                BigDecimalMath.pow(getXx().multiply(getXx()).add(getDxs().multiply(getDxs())).add(getPjz().multiply(getPjz()))
                        .divide(new BigDecimal("3"), MathContext.DECIMAL64), new BigDecimal("0.5"), MathContext.DECIMAL64)
                ;
    }

    public BigDecimal getJ5() {
        return
                BigDecimalMath.pow(getJ2().multiply(getJ2()).add(getDshs().multiply(getDshs())).add(getPjz().multiply(getPjz()))
                        .divide(new BigDecimal("3"), MathContext.DECIMAL64), new BigDecimal("0.5"), MathContext.DECIMAL64)
                ;
    }

    //.setScale(2, BigDecimal.ROUND_HALF_DOWN) =((J41^$A$42+J37^$A$42+J40^$A$42)/3)^(1/$A$42)
}
